package com.github.maojx0630.onebot.ws;

import java.util.List;
import lombok.Data;

/**
 * @author 毛家兴
 * @since 2024-04-01 15:19
 */
@Data
public class MsgInfo {

  /** 自身qq */
  private Long self_id;

  /** 发送者qq */
  private Long user_id;

  /** 时间戳 */
  private Long time;

  /** 消息id */
  private Long message_id;

  /**
   * 消息类型<br>
   * private 私聊<br>
   * group 群消息<br>
   */
  private String message_type;

  /** 原始消息内容 */
  private String raw_message;

  /** 字体 */
  private Integer font;

  /** 群号 */
  private Long group_id;

  /** 发送人信息 */
  private SenderBean sender;

  /** 消息内容 */
  private List<MessageBean> message;

  /**
   * 上报类型<br>
   * message 消息<br>
   * meta_event 元事件<br>
   * request 请求事件<br>
   * notice 通知<br>
   */
  private String post_type;

  /**
   * 通知类型<br>
   * group_increase 群成员新增<br>
   * group_decrease 群成员减少<br>
   */
  private String notice_type;

  /** 操作者qq */
  private Long operator_id;

  /**
   * 元事件类型<br>
   * heartbeat 心跳<br>
   * lifecycle 生命周期<br>
   */
  private String meta_event_type;

  /**
   * 私聊消息子类型 分别表示 'friend' 好友、'group' 群临时会话、'other' 其他<br>
   * 群消息子类型，正常消息是 normal，匿名消息是 anonymous，系统提示（如「管理员已禁止群内匿名聊天」）是 notice <br>
   * 元事件子类型，分别表示 'enable' 启用、'disable' 停用、'connect' 连接成功<br>
   * 加群时间子类型 分别表示 'add' 加群请求、'invite' 邀请登录号入群<br>
   * 退群事件子类型 分别表示 'leave' 主动退群、'kick' 被踢出群<br>
   * 群成员增加 子类型 分别表示 'approve' 成员已入群、'invite' 成员受邀入群<br>
   */
  private String sub_type;

  /**
   * 请求事件类型<br>
   * friend 好友<br>
   * group 群<br>
   */
  private String request_type;

  /** 验证信息 */
  private String comment;

  /** 请求 flag，在调用处理请求的 API 时需要传入 */
  private String flag;

  @Data
  public static class SenderBean {

    /** 发送者qq号 */
    private Long user_id;

    /** 昵称 */
    private String nickname;

    /** 群名片／备注 */
    private String card;

    /** 角色，owner 或 admin 或 member */
    private String role;

    /** 性别，male 或 female 或 unknown */
    private String sex;

    /** 年龄 */
    private Integer age;

    /** 地区 */
    private String area;

    /** 成员等级 */
    private String level;

    /** 专属头衔 */
    private String title;
  }

  @Data
  public static class MessageBean {

    /**
     * 消息类型<br>
     * text 文本消息<br>
     * at 群内@消息<br>
     * reply 回复<br>
     */
    private String type;

    /** 消息内容<br> */
    private DataBean data;

    @Data
    public static class DataBean {

      /** 被at的qq号 all全部 */
      private String qq;

      /** 被回复的qq号 */
      private String id;

      /** 文本消息内容 */
      private String text;
    }
  }
}
